<?php
namespace App\Library\Middleware;

class LoaderMiddleware
{
    /**
     * 通用加载方法
     *
     * @param string|null $type 资源类型（functions 或 constants）
     * @param string|null $module 模块名（为空时加载系统资源）
     */
    public static function load(string $type = null, string $module = null)
    {
        if (empty($type) && empty($module)) {
            // 如果都为空，加载系统的 functions 和 constants
            self::loadSystem('functions');
            self::loadSystem('constants');
        } elseif (!empty($module) && empty($type)) {
            // 如果模块不为空但类型为空，加载模块的 functions 和 constants
            self::loadModule($module, 'functions');
            self::loadModule($module, 'constants');
        } elseif (!empty($type) && empty($module)) {
            // 如果类型不为空但模块为空，加载系统资源
            self::loadSystem($type);
        } else {
            // 否则，加载模块的指定资源
            self::loadModule($module, $type);
        }
    }

    /**
     * 加载系统资源
     *
     * @param string $type 资源类型（functions 或 constants）
     */
    private static function loadSystem(string $type)
    {
        $namespace = match ($type) {
            'functions' => 'App\\Library\\Helpers\\Function',
            'constants' => 'App\\Config\\constants',
            default => throw new \InvalidArgumentException("Invalid resource type: $type")
        };
        self::loadFromNamespace($namespace, $type);
    }

    /**
     * 加载模块资源
     *
     * @param string $module 模块名
     * @param string $type 资源类型（functions 或 constants）
     */
    private static function loadModule(string $module, string $type)
    {
        $namespace = match ($type) {
            'functions' => "App\\Models\\{$module}\\Functions",
            'constants' => "App\\Models\\{$module}\\constants",
            default => throw new \InvalidArgumentException("Invalid resource type: $type")
        };
        self::loadFromNamespace($namespace, $type);
    }

    /**
     * 通用加载命名空间资源方法
     *
     * @param string $namespace 命名空间
     * @param string $type 资源类型（functions 或 constants）
     */
    private static function loadFromNamespace(string $namespace, string $type)
    {
        if ($type === 'functions') {
            $filePath = self::getFunctionsFilePath($namespace);
            if (file_exists($filePath) && !defined("{$namespace}_LOADED")) {
                define("{$namespace}_LOADED", true);
                require_once $filePath;
            }
        } elseif ($type === 'constants' && !defined("{$namespace}_LOADED") && class_exists($namespace)) {
            define("{$namespace}_LOADED", true);
            new $namespace();
        }
    }

    /**
     * 获取函数文件路径
     *
     * @param string $namespace 命名空间
     * @return string 文件路径
     */
    private static function getFunctionsFilePath(string $namespace): string
    {
        $namespacePath = str_replace(['\\', 'App\\'], [DIRECTORY_SEPARATOR, ''], $namespace);
        return APP_PATH . $namespacePath . '.php';
    }
}
